QuickSight の制限付き共有フォルダのサブフォルダが「An error occurred (PreconditionNotMetException) when calling the DeleteFolder operation: folder not empty」で削除できなくなった

QuickSight の制限付き共有フォルダのサブフォルダが「An error occurred (PreconditionNotMetException) when calling the DeleteFolder operation: folder not empty」で削除できなくなった

AWS CLI コマンド list-folder-members でどのアセットが残ってしまっているか確認し、適切な削除権限を付与して削除すれば OK です。
Clock Icon2024.10.29

コーヒーが好きな emi です。

先日、QuickSight の制限付き共有フォルダがサブフォルダをサポートしました。

https://dev.classmethod.jp/articles/quicksight-restricted-shared-folder-sub-folder/

上記ブログで検証後フォルダを削除しようとしたところ、以下のエラーで削除できませんでした。

An error occurred (PreconditionNotMetException) when calling the DeleteFolder operation: folder not empty

試行錯誤して削除に成功しましたので手順を紹介します。

はじめに結論

以下の手順で削除できました。

  • AWS CLI コマンド list-folder-members でどのアセットが残ってしまっているか確認する
  • AWS CLI コマンドで残っているアセットへ削除権限を付与する
  • 残ってしまっているアセットを削除する
  • 制限付き共有フォルダを削除する

詳細

削除できない事象の再現

制限付き共有フォルダの削除 を参考に制限付き共有フォルダのサブフォルダ削除を行います。

[アップデート] QuickSight 制限付き共有フォルダがサブフォルダをサポートしました | DevelopersIO で作成したサブフォルダを削除します。以下のように、QuickSight コンソールからサブセット内のアセットは削除済みです。

emiki_quicksight-unable-to-delete-shared-restricted-folders_1

emiki_quicksight-unable-to-delete-shared-restricted-folders_2

emiki_quicksight-unable-to-delete-shared-restricted-folders_3

list-folders コマンドでサブフォルダのフォルダ ID を取得します。

aws quicksight list-folders \
  --aws-account-id 123456789012

▼実行結果

[cloudshell-user@ip-10-130-40-84 ~]$ aws quicksight list-folders \
>   --aws-account-id 123456789012
{
    "FolderSummaryList": [
        {
            :
            :
        },
        {
            "Arn": "arn:aws:quicksight:ap-northeast-1:123456789012:folder/9e740b22-b78f-4115-8307-032d3c48bc2f",
            "FolderId": "9e740b22-b78f-4115-8307-032d3c48bc2f",
            "Name": "sub-folder",
            "FolderType": "RESTRICTED",
            "CreatedTime": "2024-10-18T03:53:41.553000+00:00",
            "LastUpdatedTime": "2024-10-18T06:51:11.832000+00:00",
            "SharingModel": "ACCOUNT"
        },
        {
            "Arn": "arn:aws:quicksight:ap-northeast-1:123456789012:folder/shared_restricted_folder_for_test-group",
            "FolderId": "shared_restricted_folder_for_test-group",
            "Name": "Shared restricted folder for test-group",
            "FolderType": "RESTRICTED",
            "CreatedTime": "2024-10-18T03:44:50.613000+00:00",
            "LastUpdatedTime": "2024-10-18T06:31:14.812000+00:00",
            "SharingModel": "ACCOUNT"
        }
    ],
    "Status": 200,
    "RequestId": "25e9c32c-1dbe-40fb-9180-ae2bcecbead9"
}
[cloudshell-user@ip-10-130-40-84 ~]$ 

サブフォルダのフォルダ ID が 9e740b22-b78f-4115-8307-032d3c48bc2f であることが分かりました。
delete-folder コマンドでサブフォルダの削除を試みます。

aws quicksight delete-folder \
  --aws-account-id 123456789012 \
  --folder-id 9e740b22-b78f-4115-8307-032d3c48bc2f

▼実行結果

[cloudshell-user@ip-10-130-40-84 ~]$ aws quicksight delete-folder \
>   --aws-account-id 123456789012 \
>   --folder-id 9e740b22-b78f-4115-8307-032d3c48bc2f

An error occurred (PreconditionNotMetException) when calling the DeleteFolder operation: folder not empty
[cloudshell-user@ip-10-130-40-84 ~]$ 

An error occurred (PreconditionNotMetException) when calling the DeleteFolder operation: folder not empty
日本語訳:DeleteFolder オペレーションでエラーが発生しました。(前提条件が満たされていない例外)フォルダーが空ではありません。

さて、「フォルダが空ではない」となってしまいました。何か見えないアセットが残っているのかもしれません。

list-folder-members コマンドで見えないアセットを確認する

list-folder-members コマンドを使うとフォルダ内のすべてのアセットを表示できますので、実行します。

aws quicksight list-folder-members \
--aws-account-id 123456789012 \
--folder-id 9e740b22-b78f-4115-8307-032d3c48bc2f

▼実行結果

[cloudshell-user@ip-10-130-40-84 ~]$ aws quicksight list-folder-members \
> --aws-account-id 123456789012 \
> --folder-id 9e740b22-b78f-4115-8307-032d3c48bc2f
{
    "FolderMemberList": [
        {
            "MemberId": "16dc667d-1884-4c90-babc-be93f7721943",
            "MemberArn": "arn:aws:quicksight:ap-northeast-1:123456789012:datasource/16dc667d-1884-4c90-babc-be93f7721943"
        }
    ],
    "Status": 200,
    "RequestId": "7f9eac34-84a4-411a-8076-23c0e8aec0c3"
}
[cloudshell-user@ip-10-130-40-84 ~]$ 

おお。コンソールからは見えませんが、データソースが残っているようです。

データソースの編集 を見ると、新しいデータセットの作成画面からデータソースが編集できるようですが、見つかりません。

emiki_quicksight-unable-to-delete-shared-restricted-folders_6

list-data-sources コマンドでもう少しこのデータソースについて見てみます。

aws quicksight list-data-sources \
  --aws-account-id 123456789012

▼実行結果

[cloudshell-user@ip-10-130-40-84 ~]$ aws quicksight list-data-sources \
>   --aws-account-id 123456789012
{
    "DataSources": [
        {
        :
        :
        },
        :
        :
        },
        {
            "Arn": "arn:aws:quicksight:ap-northeast-1:123456789012:datasource/16dc667d-1884-4c90-babc-be93f7721943",
            "DataSourceId": "16dc667d-1884-4c90-babc-be93f7721943",
            "Name": "1700_sweets_with_status.csv",
            "Type": "FILE",
            "CreatedTime": "2024-10-18T03:57:21.322000+00:00",
            "LastUpdatedTime": "2024-10-18T03:57:21.637000+00:00"
        },
        {
        :
        :
        }
    ],
    "Status": 200,
    "RequestId": "d4273ef4-150a-42cf-b210-233a90b64e25"
}
[cloudshell-user@ip-10-130-40-84 ~]$ 

なるほど、1700_sweets_with_status.csv という名前のデータソースが残っているようです。データソース ID も 16dc667d-1884-4c90-babc-be93f7721943 とわかりました。

describe-data-source-permissions コマンドで、このデータソース 1700_sweets_with_status.csv に付与された権限を確認します。

aws quicksight describe-data-source-permissions \
--aws-account-id 123456789012 \
--data-source-id 16dc667d-1884-4c90-babc-be93f7721943

▼実行結果

[cloudshell-user@ip-10-130-40-84 ~]$ aws quicksight describe-data-source-permissions \
> --aws-account-id 123456789012 \
> --data-source-id 16dc667d-1884-4c90-babc-be93f7721943
{
    "Status": 200,
    "DataSourceArn": "arn:aws:quicksight:ap-northeast-1:123456789012:datasource/16dc667d-1884-4c90-babc-be93f7721943",
    "DataSourceId": "16dc667d-1884-4c90-babc-be93f7721943",
    "Permissions": [],
    "RequestId": "860c2161-bd51-4502-9b56-c898a867647c"
}
[cloudshell-user@ip-10-130-40-84 ~]$ 

"Permissions": [] という空の配列が返されています。これはこのデータソースに対してアクセス権限が付与されていない、つまり、現在このデータソースにアクセスできるユーザーやグループは存在しないということを意味しています。そんな状態になってしまうのか……

アセットへのアクセス権限を付与

では、誰もアクセスできないこのデータソース 1700_sweets_with_status.csvupdate-data-source-permissions コマンドで権限を付与します。

QuickSight の権限付与系のコマンドは横に長くなりがちなので、CLI スケルトンを利用します。詳細は以下ブログを参照ください。

https://dev.classmethod.jp/articles/quicksight-restricted-shared-folders-cli-skeleton/

まずは update-data-source-permissions コマンドの CLI スケルトンファイルのひな形を作成します。

aws quicksight update-data-source-permissions \
  --generate-cli-skeleton > update-data-source-permissions.json

▼実行結果

[cloudshell-user@ip-10-130-40-84 ~]$ aws quicksight update-data-source-permissions \
>   --generate-cli-skeleton > update-data-source-permissions.json
[cloudshell-user@ip-10-130-40-84 ~]$ 

cat コマンドで update-data-source-permissions.json の中身を確認すると、以下のようになっています。

[cloudshell-user@ip-10-130-40-84 ~]$ cat update-data-source-permissions.json 
{
    "AwsAccountId": "",
    "DataSourceId": "",
    "GrantPermissions": [
        {
            "Principal": "",
            "Actions": [
                ""
            ]
        }
    ],
    "RevokePermissions": [
        {
            "Principal": "",
            "Actions": [
                ""
            ]
        }
    ]
}
[cloudshell-user@ip-10-130-40-84 ~]$ 

今回は DataAnalysisUser1 というユーザーが所属している test-group というグループが、データソース 1700_sweets_with_status.csv にアクセスできるよう権限を付与していきます。

emiki_quicksight-unable-to-delete-shared-restricted-folders_5

権限を付与したいグループの ARN を list-groups コマンドで取得します。

aws quicksight list-groups \
  --aws-account-id 123456789012 \
  --namespace default

▼実行結果

[cloudshell-user@ip-10-130-40-84 ~]$ aws quicksight list-groups \
>   --aws-account-id 123456789012 \
>   --namespace default
{
    "GroupList": [
        {
            "Arn": "arn:aws:quicksight:ap-northeast-1:123456789012:group/default/test-group",
            "GroupName": "test-group",
            "Description": "test-group",
            "PrincipalId": "group/d-956747a400/7d75c34e-667b-41ed-9a29-b685b3f87a78"
        }
    ],
    "Status": 200,
    "RequestId": "23667b47-5bb6-4f23-a4fb-4dbb71f62dee"
}
[cloudshell-user@ip-10-130-40-84 ~]$ 

test-group の ARN が arn:aws:quicksight:ap-northeast-1:123456789012:group/default/test-group と分かりました。
update-data-source-permissions.json を以下のように編集します。

update-data-source-permissions.json
{
    "AwsAccountId": "123456789012",
    "DataSourceId": "16dc667d-1884-4c90-babc-be93f7721943",
    "GrantPermissions": [
        {
            "Principal": "arn:aws:quicksight:ap-northeast-1:123456789012:group/default/test-group",
            "Actions": [
                "quicksight:UpdateDataSourcePermissions",
                "quicksight:DescribeDataSourcePermissions",
                "quicksight:PassDataSource",
                "quicksight:DescribeDataSource",
                "quicksight:DeleteDataSource",
                "quicksight:UpdateDataSource"
            ]
        }
    ]
}

これは、"Principal" に設定したグループのユーザーが、データソースに関する操作 "Actions" を実行できる権限を付与する JSON ファイルです。
今回は削除だけできればいいのですが、検証なのでデータソースに関するアクションを諸々付与するように JSON を作ってみました。

では、update-data-source-permissions コマンドで権限を付与します。

aws quicksight update-data-source-permissions \
  --cli-input-json file://update-data-source-permissions.json

▼実行結果

[cloudshell-user@ip-10-130-40-84 ~]$ aws quicksight update-data-source-permissions \
>   --cli-input-json file://update-data-source-permissions.json
{
    "Status": 200,
    "DataSourceArn": "arn:aws:quicksight:ap-northeast-1:123456789012:datasource/16dc667d-1884-4c90-babc-be93f7721943",
    "DataSourceId": "16dc667d-1884-4c90-babc-be93f7721943",
    "RequestId": "f9e67593-9802-4b32-85ff-6bdbf2f8e703"
}
[cloudshell-user@ip-10-130-40-84 ~]$ 

権限が付与されたか describe-data-source-permissions コマンドで確認します。

aws quicksight describe-data-source-permissions \
--aws-account-id 123456789012 \
--data-source-id 16dc667d-1884-4c90-babc-be93f7721943

▼実行結果

[cloudshell-user@ip-10-130-40-84 ~]$ aws quicksight describe-data-source-permissions \
> --aws-account-id 123456789012 \
> --data-source-id 16dc667d-1884-4c90-babc-be93f7721943
{
    "Status": 200,
    "DataSourceArn": "arn:aws:quicksight:ap-northeast-1:123456789012:datasource/16dc667d-1884-4c90-babc-be93f7721943",
    "DataSourceId": "16dc667d-1884-4c90-babc-be93f7721943",
    "Permissions": [
        {
            "Principal": "arn:aws:quicksight:ap-northeast-1:123456789012:group/default/test-group",
            "Actions": [
                "quicksight:PassDataSource",
                "quicksight:DescribeDataSourcePermissions",
                "quicksight:UpdateDataSource",
                "quicksight:UpdateDataSourcePermissions",
                "quicksight:DescribeDataSource",
                "quicksight:DeleteDataSource"
            ]
        }
    ],
    "RequestId": "a2c00951-dd90-4365-9bf4-bf2b8aa4b559"
}
[cloudshell-user@ip-10-130-40-84 ~]$ 

いいですね。権限が付与できました。

残っているアセットの削除

では、test-group グループに所属しているユーザー DataAnalysisUser1 で、delete-data-source コマンドを使いデータソースを削除します。

aws quicksight delete-data-source \
  --aws-account-id 123456789012 \
  --data-source-id 16dc667d-1884-4c90-babc-be93f7721943

▼実行結果

[cloudshell-user@ip-10-130-49-175 ~]$ aws quicksight delete-data-source \
>   --aws-account-id 123456789012 \
>   --data-source-id 16dc667d-1884-4c90-babc-be93f7721943
{
    "Status": 200,
    "Arn": "arn:aws:quicksight:ap-northeast-1:123456789012:datasource/16dc667d-1884-4c90-babc-be93f7721943",
    "DataSourceId": "16dc667d-1884-4c90-babc-be93f7721943",
    "RequestId": "163347f8-c7ab-4e91-a2ab-3a845554cebc"
}
[cloudshell-user@ip-10-130-49-175 ~]$ 

"Status": 200 が返ってきており、無事成功していそうです。
list-folder-members コマンドで、サブフォルダーの中が空か確認します。

aws quicksight list-folder-members \
--aws-account-id 123456789012 \
--folder-id 9e740b22-b78f-4115-8307-032d3c48bc2f

▼実行結果

[cloudshell-user@ip-10-130-40-84 ~]$ aws quicksight list-folder-members \
> --aws-account-id 123456789012 \
> --folder-id 9e740b22-b78f-4115-8307-032d3c48bc2f
{
    "FolderMemberList": [],
    "Status": 200,
    "RequestId": "50be3418-dafb-40cf-97a4-b32ebb6e2dde"
}
[cloudshell-user@ip-10-130-40-84 ~]$ 

"FolderMemberList": [] という空の配列が返されています。サブフォルダの中身は空になりました。

サブフォルダの削除

今度こそサブフォルダを削除できるか再チャレンジします。

aws quicksight delete-folder \
  --aws-account-id 123456789012 \
  --folder-id 9e740b22-b78f-4115-8307-032d3c48bc2f

▼実行結果

[cloudshell-user@ip-10-130-40-84 ~]$ aws quicksight delete-folder \
>   --aws-account-id 123456789012 \
>   --folder-id 9e740b22-b78f-4115-8307-032d3c48bc2f
{
    "Status": 200,
    "Arn": "arn:aws:quicksight:ap-northeast-1:123456789012:folder/9e740b22-b78f-4115-8307-032d3c48bc2f",
    "FolderId": "9e740b22-b78f-4115-8307-032d3c48bc2f",
    "RequestId": "6675d743-58ae-4eb7-9a03-6d4c97206d68"
}
[cloudshell-user@ip-10-130-40-84 ~]$ 

コマンドが成功しました。QuickSight コンソールを見ると、サブフォルダが消えています!

emiki_quicksight-unable-to-delete-shared-restricted-folders_7

これで、親の制限付き共有フォルダも消せるはずです。親フォルダも削除します。

aws quicksight delete-folder \
  --aws-account-id 123456789012 \
  --folder-id shared_restricted_folder_for_test-group

▼実行結果

[cloudshell-user@ip-10-130-40-84 ~]$ aws quicksight delete-folder \
>   --aws-account-id 123456789012 \
>   --folder-id shared_restricted_folder_for_test-group
{
    "Status": 200,
    "Arn": "arn:aws:quicksight:ap-northeast-1:123456789012:folder/shared_restricted_folder_for_test-group",
    "FolderId": "shared_restricted_folder_for_test-group",
    "RequestId": "dc5f544f-c8a3-484f-9e9c-f7c752a49da1"
}
[cloudshell-user@ip-10-130-40-84 ~]$ 

emiki_quicksight-unable-to-delete-shared-restricted-folders_8

すべての制限付き共有フォルダが削除できました。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.